package com.toannv.extension;

import java.util.Date;
import java.util.List;
import java.util.Stack;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.TimeUnit;

import com.smartfoxserver.v2.SmartFoxServer;
import com.smartfoxserver.v2.core.SFSEventType;
import com.smartfoxserver.v2.entities.Room;
import com.smartfoxserver.v2.entities.User;
import com.smartfoxserver.v2.entities.Zone;
import com.smartfoxserver.v2.entities.data.SFSObject;
import com.smartfoxserver.v2.entities.variables.ReservedRoomVariables;
import com.smartfoxserver.v2.extensions.SFSExtension;
import com.toannv.card.CardsList;
import com.toannv.card.card;
import com.toannv.definitions.RequestId;
import com.toannv.handler.AnBaiHandler;
import com.toannv.handler.BocBaiHandler;
import com.toannv.handler.DanhBaiHandler;
import com.toannv.handler.HaPhomHandler;
import com.toannv.handler.batDauHandler;
import com.toannv.handler.leaveRoomHandler;

public class RoomExtension extends SFSExtension{
	
	public static final String UPDATE = "U";
	public static final String TIME_STAMP = "T";
	
	public SFSObject sfsObject = new SFSObject();
	public long StartTime = 0;
	SmartFoxServer sfs;
	ScheduledFuture<?> taskScheduler;
	List<User> userList;
	long CurrentTime = 0;
	int UPDATE_FREQUENCY = 33;
	int DELAY = 0;
	Date now;
	
	//tạo random một stack chứa 52 quân bài
	public static Stack<card> card = CardsList.ListOfCard();
	public static card CardOfUser[][];// lưu trữ các quân bài trên tay của người chơi
	public static Stack<card> CardOfUser0Push; //lưu trữ các quân bài người chơi có id = 0 đánh
	public static Stack<card> CardOfUser1Push;//lưu trữ các quân bài người chơi có id = 1 đánh
	public static Stack<card> CardOfUser2Push;//lưu trữ các quân bài người chơi có id = 2 đánh
	public static Stack<card> CardOfUser3Push;//lưu trữ các quân bài người chơi có id = 3 đánh
	
	public static Stack<card> CardOfUser0Eat;//lưu trữ các quân bài người chơi có id = 0 ăn
	public static Stack<card> CardOfUser1Eat;//lưu trữ các quân bài người chơi có id = 1 ăn
	public static Stack<card> CardOfUser2Eat;//lưu trữ các quân bài người chơi có id = 2 ăn
	public static Stack<card> CardOfUser3Eat;//lưu trữ các quân bài người chơi có id = 3 ăn
	//lưu trữ id của người có quyền đánh
	public static int UserRunning = 0;
	//Lưu trữ số lượng người chơi trong phòng chơi
	public static int NumberOfPlayers = 0;
	
	public static int idOfStartGame = 0;//lưu lại id của người đánh đầu tiên của vòng đánh
	
	public static int haPhomid = 0;
	
	@Override
	public void init() {
		// TODO Auto-generated method stub
		
		sfs = SmartFoxServer.getInstance();
		taskScheduler = sfs.getTaskScheduler().scheduleAtFixedRate(new BroadcastTask(), DELAY, UPDATE_FREQUENCY, TimeUnit.MILLISECONDS);
		
		
		//khi nguoi choi gui yeu cau bắt đầu chơi
		addRequestHandler(RequestId.BAT_DAU, batDauHandler.class);
		
		//Khi nguoi choi gui yeu cau danh bai
		addRequestHandler(RequestId.DANH_BAI, DanhBaiHandler.class);
		
		//Khi nguoi choi gui yeu cau boc bai
		addRequestHandler(RequestId.BOC_BAI, BocBaiHandler.class);
		
		addRequestHandler(RequestId.AN_BAI, AnBaiHandler.class);
		
		//handler leave room
		addEventHandler(SFSEventType.USER_LEAVE_ROOM, leaveRoomHandler.class);
		
		addRequestHandler(RequestId.HA_PHOM, HaPhomHandler.class);
	}
	
	public Room getRoom(){
		return this.getParentRoom();
	}
	
	public Zone getZone(){
		return this.getZone();
	}
	
	private class BroadcastTask implements Runnable{

		@Override
		public void run() {
			// TODO Auto-generated method stub
			userList = getRoom().getUserList();
			
			if(sfsObject.size()>0 && (!getParentRoom().getVariable(ReservedRoomVariables.RV_GAME_STARTED).isNull())){
				now = new Date();
				CurrentTime = now.getTime() - StartTime;
				sfsObject.putLong(TIME_STAMP, CurrentTime);
				
				send(RoomExtension.UPDATE, sfsObject, userList, true);
				
				if(userList.isEmpty()){
					taskScheduler.cancel(true);
				}
			}
		}
		
	}

	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		super.destroy();
		taskScheduler.cancel(true);
	}
}
